import { ref, nextTick } from "vue";
import { ElMessage } from "element-plus";
import { dateformat } from "@/utils/date";
import { resetFeatures, updateFeature, removeFeature } from "./feature";
import { extractBaseUrl, downloadImageAsBase64 } from "@/utils/axios";
/**
 * 数据存储键名
 */
export const DB_KEY = "file-collections";

/**
 * 响应式数据列表
 */
export const favorateList = ref([]);
// 模拟数据
// favorateList.value = [
//   {
//     path: "E:\\project\\utools\\.gitignore",
//     name: ".gitignore",
//     type: "file",
//     icon: "",
//     tags: ["重要", "文档"],
//     inputVisible: false,
//     inputValue: "",
//   },
// ];

/**
 * 添加网址弹窗数据
 */
export const website = ref({
  name: "",
  url: "",
});

/**
 * 添加网址弹窗引用
 */
export const addWebsiteDialog = ref();

/**
 * 添加应用弹窗引用
 */
export const addAppDialog = ref();

/**
 * 保存列表数据到 uTools 数据库
 */
export const saveList = () => {
  // 使用 uTools dbStorage 保存数据
  utools.dbStorage.setItem(DB_KEY, JSON.stringify(favorateList.value));
  console.log("🚀 ~ saveList ~ favorateList.value:", favorateList.value);
};

/**
 * 从 uTools 数据库加载数据
 */
export const loadList = () => {
  const data = utools.dbStorage.getItem(DB_KEY);
  if (data) {
    favorateList.value = JSON.parse(data);
  }
};

/**
 * 点击重置快开索引按钮
 */
export const onReset = () => {
  resetFeatures(favorateList.value);
};

/**
 * 导出功能,导出时不会导出多余的字段（icon, inputVisible, inputValue）
 */
export const onExport = () => {
  // 打开文件夹选择对话框
  const result = utools.showOpenDialog({
    title: "选择导出文件夹",
    message: "请选择要导出到的文件夹",
    properties: ["openDirectory"], // 只能选择文件夹
  });

  if (result) {
    const folderPath = Array.isArray(result) ? result[0] : result;

    // 创建导出数据，移除icon字段
    const exportData = favorateList.value.map((item) => {
      const { icon, inputVisible, inputValue, ...rest } = item;
      return rest;
    });

    // 生成带时间戳的文件名
    const timestamp = dateformat(new Date(), "YYYY-MM-DD HH-mm-ss");
    const exportFileName = `file-collection-${timestamp}.json`;
    const exportPath = window.services.fs.pathJoin(folderPath, exportFileName);

    // 将数据写入文件
    window.services.fs.writeFile(
      exportPath,
      JSON.stringify(exportData, null, 4)
    );
    ElMessage.success(`数据已导出到: ${exportPath}`);
  }
};

/**
 * 导入功能
 */
export const onImport = () => {
  // 打开文件选择对话框
  const result = utools.showOpenDialog({
    title: "选择导入文件",
    message: "请选择要导入的JSON文件",
    properties: ["openFile"], // 只能选择文件
    filters: [{ name: "JSON Files", extensions: ["json"] }], // 限制为JSON文件
  });

  if (result) {
    const filePath = Array.isArray(result) ? result[0] : result;

    // 读取文件内容
    const fileContent = window.services.fs.readFile(filePath);
    const importData = JSON.parse(fileContent);

    if (!Array.isArray(importData)) {
      ElMessage.error("导入文件格式不正确");
      return;
    }

    // 处理导入的数据
    importData.forEach((item) => {
      // 检查是否已存在相同路径的项目
      const existingIndex = favorateList.value.findIndex(
        (listItem) => listItem.path === item.path
      );

      let newItem = undefined;
      if (existingIndex === -1) {
        // 如果不存在，则添加新项目
        const icon = utools.getFileIcon(item.path);
        newItem = {
          ...item,
          icon,
          inputVisible: false,
          inputValue: "",
        };
        favorateList.value.push(newItem);
      } else {
        // 如果已存在，则仅仅更新现有项目的tags
        const existingItem = favorateList.value[existingIndex];
        newItem = {
          ...existingItem,
          tags: [...new Set([...existingItem.tags, ...item.tags])],
        };
        favorateList.value[existingIndex] = newItem;
      }
      // 更新标签对应功能
      updateFeature(newItem);
    });

    // 保存到数据库
    saveList();

    ElMessage.success("导入完成，数据已更新");
  }
};

/**
 * 在删除标签时也保存数据
 * @param {Object} row - 表格行数据
 * @param {String} tag - 要删除的标签
 */
export const handleTagClose = (row, tag) => {
  row.tags.splice(row.tags.indexOf(tag), 1);
  // 更新标签对应的功能
  updateFeature(row);
  // 删除标签后保存
  saveList();
};

/**
 * 标签添加
 * @param {Object} row - 表格行数据
 */
export const handleInputConfirm = (row) => {
  //校验输入是否为空
  if (row.inputValue) {
    if (row.tags.includes(row.inputValue)) {
      ElMessage.warning("标签已存在");
    } else {
      row.tags.push(row.inputValue);
      // 将标签添加为功能
      updateFeature(row);
    }
  }
  row.inputVisible = false;
  row.inputValue = "";

  // 添加标签后保存
  saveList();
};

/**
 * 打开文件或文件夹
 * @param {Object} row - 表格行数据
 */
export const openItem = (row) => {
  if (row.type === "folder") {
    // 检查文件或文件夹是否存在
    if (!window.services.fs.isFileExists(row.path)) {
      ElMessage.error("路径对应的文件或文件夹不存在");
      return;
    }
    // 文件管理器中打开
    utools.shellOpenPath(row.path);
  } else if (row.type === "file") {
    // 检查文件或文件夹是否存在
    if (!window.services.fs.isFileExists(row.path)) {
      ElMessage.error("路径对应的文件或文件夹不存在");
      return;
    }
    // 文件管理器中打开
    utools.shellShowItemInFolder(row.path);
  } else if (row.type === "website") {
    // 默认协议打开
    utools.shellOpenExternal(row.path);
  }
};

/**
 * 删除记录
 * @param {Object} row - 表格行数据
 */
export const deleteItem = (row) => {
  favorateList.value = favorateList.value.filter(
    (item) => item.path !== row.path
  );
  // 删除功能
  removeFeature(row);
  // 删除后需要保存操作
  saveList();
  ElMessage.success("文件删除成功");
};

/**
 * 校验文件或文件夹是否已存在于列表中
 * @param {String} path - 文件或文件夹路径
 * @returns {Boolean} - 是否已存在
 */
export const isPathExists = (path) => {
  const exists = favorateList.value.some((item) => item.path === path);
  if (exists) {
    ElMessage.warning("文件/文件夹已存在");
  }
  return exists;
};

/**
 * 添加通过 BPpayload 进来的文件和文件夹
 * @param {Array} list - 包含文件和文件夹信息的数组
 */
export const addFilesAndFoldersByPayload = (list) => {
  if (!list || !Array.isArray(list) || list.length === 0) {
    return;
  }

  // 分离文件和文件夹
  const files = [];
  const folders = [];

  list.forEach((item) => {
    if (item.isFile) {
      files.push(item.path);
    } else if (item.isDirectory) {
      folders.push(item.path);
    }
  });

  // 分别调用对应的添加方法
  if (files.length > 0) {
    addFile(files);
  }

  if (folders.length > 0) {
    addFolder(folders);
  }
};

export const addFile = (list) => {
  if (!list || !Array.isArray(list) || list.length === 0) {
    return;
  }

  list.forEach((filePath) => {
    if (isPathExists(filePath)) {
      return;
    }

    // 获取文件夹名称
    const fileName = window.services.fs.getFileName(filePath);

    // 获取文件图标
    const txtIcon = utools.getFileIcon(filePath);

    // 添加到列表中
    const newFile = {
      name: fileName,
      path: filePath,
      type: "file",
      icon: txtIcon,
      tags: [fileName],
      inputVisible: false,
      inputValue: "",
    };
    favorateList.value.push(newFile);

    // 将文件添加为功能
    updateFeature(newFile);

    // 保存到数据库
    saveList();
    ElMessage.success(`${fileName}添加成功`);
  });
};

/**
 * 添加文件夹
 */
export const addFolder = (list) => {
  if (!list || !Array.isArray(list) || list.length === 0) {
    return;
  }

  list.forEach((folderPath) => {
    if (isPathExists(folderPath)) {
      return;
    }

    // 获取文件夹名称
    const folderName = window.services.fs.getFileName(folderPath);

    // 获取文件图标
    const txtIcon = utools.getFileIcon(folderPath);

    // 添加到列表中
    const newFolder = {
      name: folderName,
      path: folderPath,
      type: "folder",
      icon: txtIcon,
      tags: [folderName],
      inputVisible: false,
      inputValue: "",
    };
    favorateList.value.push(newFolder);

    // 将文件添加为功能
    updateFeature(newFolder);

    saveList(); // 保存到数据库
    ElMessage.success(`${folderName}添加成功`);
  });
};

/**
 * 点击添加文件按钮
 */
export const onAddFile = () => {
  // 打开文件选择对话框
  const list = utools.showOpenDialog({
    title: "选择文件（可多选）",
    properties: ["openFile", "multiSelections"], // 只能选择文件
    buttonLabel: "确认选择",
  });

  addFile(list);
};

/**
 * 点击添加文件夹按钮
 */
export const onAddFolder = () => {
  // 打开文件夹选择对话框
  const list = utools.showOpenDialog({
    title: "选择文件夹（可多选）",
    properties: ["openDirectory", "multiSelections"], // 只能选择文件夹
    buttonLabel: "确认选择",
  });

  addFolder(list);
};

/**
 * 添加网站
 * @param {String} url 网址
 */
export const addWebsite = async ({ url, name }) => {
  const baseUrl = extractBaseUrl(url);
  const faviconIconUrl = `${baseUrl}/favicon.ico`;
  const icon = await downloadImageAsBase64(faviconIconUrl);

  // 添加到列表中
  const newFolder = {
    name: name,
    path: url,
    type: "website",
    icon: icon,
    tags: [name],
    inputVisible: false,
    inputValue: "",
  };
  favorateList.value.push(newFolder);

  // 将文件添加为功能
  updateFeature(newFolder);

  saveList(); // 保存到数据库
  ElMessage.success(`${name}添加成功`);
};

/**
 * 通过命令识别添加网页
 */
export const addWebsiteByPayload = (url) => {
  // 预设网址设置为命令匹配的网址
  website.value.url = url;
  console.log("通过命令识别添加网页", url);

  // 打开添加网站弹窗
  addWebsiteDialog.value.open();
};

/**
 * 点击添加网站按钮
 */
export const onAddWebsite = () => {
  console.log("点击添加网站按钮");
  if (!addWebsiteDialog.value) {
    return;
  }
  addWebsiteDialog.value.open();
};

/**
 * 点击添加应用按钮
 */
export const onAddApp = () => {
  addAppDialog.value.open();
};

/**
 * 添加网站弹窗提交事件
 */
export const onAddWebsiteDialogConfirm = (form) => {
  // 添加网站
  addWebsite(form);
  // 清空预置数据
  website.value = {
    name: "",
    url: "",
  };
};
